<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Title</title>
</head>
<body>

</body>
<script>
	// 准备1
	// Function.prototype.myCall = function(){
	// 	console.log("myCall",this===fn);
	// }
	// const fn = function(){
	//
	// }
	// console.log(fn.__proto__ === Function.prototype)/// true
	// fn.myCall();
	
	// 准备2
	// function fn(...arg){
	// 	console.log(Array.from(arguments));
	// 	console.log([...arguments]);
	// 	console.log(arg);
	// };
	// fn(1,2,3,4);
	
	// 准备
	// function fn([a,b,c,d]){
	// 	console.log(a,b,c,d);
	// }
	// fn([1,2,3,4]);
	
	// function fn(a,b,c,d){
	// 	console.log(a,b,c,d);
	// }
	// fn(...[1,2,3,4]);
	
	// eval("console.log(1)");
	//
	// function fn(a,b,c,d){
	// 	console.log(a,b,c,d);
	// }
	// eval("fn(100,200,300,400)")
	
	
	
	// call-->来自于Function.prototype.call
	// call-->接收的第一个参数是指定的this指向，从第二个参数开始是传递的实参
	// call-->第一个参数如果是undefined,null那么绑定的this是window
	// call-->第一个参数如果是字符串，布尔，数字，那么绑定的this是对应的包装对象。
	// call-->第一个参数如果是数组，对象，函数，那么绑定的this是对应的数组，对象，函数
	
	// 1
	// Function.prototype.myCall = function(context){
	// 	let fnName = Math.random().toString(36).slice(2);
	// 	context[fnName] = this;
	// 	context[fnName]();
	// 	delete context[fnName];
	// }
	// function fn(){
	// 	console.log("fn",this===obj);
	// }
	// const obj = {a:1};
	// fn.myCall(obj);
	
	
	// 2- 传递参数
	// Function.prototype.myCall = function(context,...arg){
	// 	let fnName = Math.random().toString(36).slice(2);
	// 	context[fnName] = this;
	// 	context[fnName](...arg);
	// 	delete context[fnName];
	// }
	// function fn(a,b,c){
	// 	console.log("fn",this===obj,a,b,c);
	// }
	// const obj = {a:1};
	// fn.myCall(obj,1,2,3);
	
	// 3
	// Function.prototype.myCall = function(context,...arg){
	// 	if(typeof context === "string" || typeof context === "boolean" || typeof context==="number"){
	// 		context = new Object(context);
	// 	}else if(context===undefined || context ===null){
	// 		context = window;
	// 	}
	// 	let fnName = Math.random().toString(36).slice(2);
	// 	context[fnName] = this;
	// 	context[fnName](...arg);
	// 	delete context[fnName];
	// }
	// function fn(a,b,c){
	// 	console.log("fn",this,a,b,c);
	// }
	// fn.myCall(undefined,1,2,3);
	// fn.myCall(null,1,2,3);
	// fn.myCall(1,1,2,3);
	// fn.myCall("1",1,2,3);
	// fn.myCall([1,2,3],1,2,3);
	
	
	
</script>
</html>